#ifndef _SCIENCE_MATHEMATICS_ALGEBRA_NUMBER_LINE_H_
#define _SCIENCE_MATHEMATICS_ALGEBRA_NUMBER_LINE_H_
//-----------------------------------------------------------------------------------------------------//
//																	                                   //
// number_line.h  contains definitions of the number line type and the                                 //
// functions needed to draw it and process its contents.					                           //
//																									   //
// author	: Eng. Ahmed Yasser																		   //
// data		: 21-01-2015																			   //
//																	                                   //
//-----------------------------------------------------------------------------------------------------//

#include <vector>

#include "..\..\..\common\include\opengl_draws.h"
#include "..\include\interval.h"

//-----------------------------------------------------------------------------------------------------//
//																									   //
// the structure that define the number line														   //
//																									   //
//-----------------------------------------------------------------------------------------------------//

// the drawing info of the line
struct number_line_draw_info_t
{
	float sx;			// the starting point of the line
	float ex;			// the ending point of the line
	float length_x;	// the length of the line in the x axis
};

// the number line type
struct number_line_t
{
	float origin_x;		// the origin x of the number line
	float origin_y;		// the origin y of the number line
	float step;			// the step value
	unsigned int length;	// the number of steps in each side of the number line
	bool is_vertical;		// if the number line is vertical
	number_line_draw_info_t draw_info;	// the draw info of the line
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: create_number_line																	   //
//																									   //
// desc		: create a number line													                   //
//																									   //
// params	:																						   //
//		float x	: the origin x of the number line												   //
//		float y	: the origin y of the number line												   //
//		float s	: the step value																   //
//		unsigned int l	: the number of steps in each side of the number line						   //
//		bool is_v : if the number line is vertical or not
// returns	: the created number line																   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
number_line_t create_number_line(float x, float y, float s, unsigned int l, bool is_v = false);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: transform_to_number_line																   //
//																									   //
// desc		: transforms the world of opengl to fit in this number line				                   //
//																									   //
// params	:																						   //
//		const number_line_t& nl	: the number line to transform to									   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void transform_to_number_line(const number_line_t& nl);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: draw_number_line																	       //
//																									   //
// desc		: draws a number line													                   //
//																									   //
// params	:																						   //
//		const number_line_t& nl	: the number line to draw											   //
//		float r	: the red color of the line														   //
//		float g	: the green color of the line													   //
//		float b	: the blue color of the line													   //
//		float a	: the alpha color of the line													   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void draw_number_line(const number_line_t& nl, float r, float g, float b, float a);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: draw_interval																	           //
//																									   //
// desc		: draws an interval on a number line													   //
//																									   //
// params	:																						   //
//		const interval_t& interval	: the interval to draw											   //
//		const number_line_t& nl	: the number line to draw interval on it							   //
//		float r	: the red color of the interval													   //
//		float g	: the green color of the interval												   //
//		float b	: the blue color of the interval												   //
//		float a	: the alpha color of the interval												   //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void draw_interval(const interval_t& interval, const number_line_t& nl, float r, float g, float b, float a);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: draw_number																	           //
//																									   //
// desc		: draws a number on a number line													       //
//																									   //
// params	:																						   //
//		float num	: the number to draw															   //
//		const number_line_t& nl	: the number line to draw number on it							       //
//		float r	: the red color of the number													   //
//		float g	: the green color of the number													   //
//		float b	: the blue color of the number												       //
//		float a	: the alpha color of the number												       //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void draw_number(float num, const number_line_t& nl, float r, float g, float b, float a);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// name		: draw_numbers																	           //
//																									   //
// desc		: draws a list of numbers on a number line											       //
//																									   //
// params	:																						   //
//		std::vector<float> nums	: the list of numbers to draw									   //
//		const number_line_t& nl	: the number line to draw number on it							       //
//		float r	: the red color of the number													   //
//		float g	: the green color of the number													   //
//		float b	: the blue color of the number												       //
//		float a	: the alpha color of the number												       //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void draw_numbers(std::vector<float> nums, const number_line_t& nl, float r, float g, float b, float a);

#endif